package com.ltcode.auth.domain.repository;

import com.ltcode.auth.domain.model.AuthUser;

import java.util.Optional;

/**
 * 认证用户仓储接口
 * 
 * @author ltcode
 * @since 2024-01-01
 */
public interface AuthUserRepository {

    /**
     * 根据用户名查询用户
     * 
     * @param username 用户名
     * @return 用户信息
     */
    Optional<AuthUser> findByUsername(String username);

    /**
     * 根据用户ID查询用户
     * 
     * @param userId 用户ID
     * @return 用户信息
     */
    Optional<AuthUser> findById(Long userId);

    /**
     * 根据邮箱查询用户
     * 
     * @param email 邮箱
     * @return 用户信息
     */
    Optional<AuthUser> findByEmail(String email);

    /**
     * 根据手机号查询用户
     * 
     * @param phoneNumber 手机号
     * @return 用户信息
     */
    Optional<AuthUser> findByPhoneNumber(String phoneNumber);

    /**
     * 保存用户信息
     * 
     * @param user 用户信息
     * @return 保存后的用户信息
     */
    AuthUser save(AuthUser user);

    /**
     * 更新用户登录信息
     * 
     * @param userId 用户ID
     * @param loginIp 登录IP
     */
    void updateLoginInfo(Long userId, String loginIp);

    /**
     * 更新用户密码
     * 
     * @param userId 用户ID
     * @param newPassword 新密码（已加密）
     */
    void updatePassword(Long userId, String newPassword);

    /**
     * 检查用户名是否存在
     * 
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 检查邮箱是否存在
     * 
     * @param email 邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);

    /**
     * 检查手机号是否存在
     * 
     * @param phoneNumber 手机号
     * @return 是否存在
     */
    boolean existsByPhoneNumber(String phoneNumber);

    /**
     * 根据用户ID获取用户权限
     * 
     * @param userId 用户ID
     * @return 权限列表
     */
    java.util.Set<String> findPermissionsByUserId(Long userId);

    /**
     * 根据用户ID获取用户角色
     * 
     * @param userId 用户ID
     * @return 角色列表
     */
    java.util.Set<String> findRolesByUserId(Long userId);
}
